From: Jonathan Davies Date: Fri, 7 Apr 2017 13:27:19 +0000 (+0100) Subject: oxenstored: avoid leading slash in paths in saved store state X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~2245 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=506114e9183de1640f3c2e5b66f4980b596164f7;p=xen.git oxenstored: avoid leading slash in paths in saved store state Internally, paths are represented as lists of strings, where * path "/" is represented by [] * path "/local/domain/0" is represented by ["local"; "domain"; "0"] (see comment for Store.Path.t). However, the traversal function generated paths like [""; "local"; "domain"; "0"] because the name of the root node is "". Change it to generate paths correctly. Furthermore, the function passed to Store.dump_fct would render the node "foo" under the path [] as "//foo". Change this to return "/foo". Signed-off-by: Jonathan Davies Reviewed-by: Wei Liu Reviewed-by: Christian Lindig Release-acked-by: Julien Grall --- diff --git a/tools/ocaml/xenstored/store.ml b/tools/ocaml/xenstored/store.ml index 9f619b8fd5..13cf3b5bf4 100644 --- a/tools/ocaml/xenstored/store.ml +++ b/tools/ocaml/xenstored/store.ml @@ -122,6 +122,11 @@ let of_string s = | "" :: path when is_valid path -> path | _ -> raise Define.Invalid_path +let of_path_and_name path name = + match path, name with + | [], "" -> [] + | _ -> path @ [name] + let create path connection_path = of_string (Utils.path_validate path connection_path) @@ -343,7 +348,8 @@ let path_exists store path = let traversal root_node f = let rec _traversal path node = f path node; - List.iter (_traversal (path @ [ Symbol.to_string node.Node.name ])) node.Node.children + let node_path = Path.of_path_and_name path (Symbol.to_string node.Node.name) in + List.iter (_traversal node_path) node.Node.children in _traversal [] root_node diff --git a/tools/ocaml/xenstored/xenstored.ml b/tools/ocaml/xenstored/xenstored.ml index 09da257150..77fd9e3bac 100644 --- a/tools/ocaml/xenstored/xenstored.ml +++ b/tools/ocaml/xenstored/xenstored.ml @@ -213,7 +213,7 @@ let to_channel store cons chan = (* dump the store *) Store.dump_fct store (fun path node -> let name, perms, value = Store.Node.unpack node in - let fullpath = (Store.Path.to_string path) ^ "/" ^ name in + let fullpath = Store.Path.to_string (Store.Path.of_path_and_name path name) in let permstr = Perms.Node.to_string perms in fprintf chan "store,%s,%s,%s\n" (hexify fullpath) (hexify permstr) (hexify value) );